﻿using dbe.FoundationLibrary.Core.Win32.Structures;

using System;
using System.Runtime.InteropServices;

namespace dbe.FoundationLibrary.Core.Win32.API
{
    /// <summary>
    /// <c>"gdi32.dll"</c>中的Api
    /// </summary>
    /// <example>
    /// 以下是一个示例，演示如何直接使用gdi32.dll中的C++函数绘图：
    /// <code lang="cpp">
    /// <![CDATA[
    ///     HDC hdc = GetDC(NULL);
    ///     HDC hdcMem = CreateCompatibleDC(hdc);
    ///     
    ///     // 设置 stretching 模式
    ///     SetStretchBltMode(hdcMem, STRETCH_ANDSCANS);
    ///     
    ///     // 创建一个位图，用于存储源图像
    ///     HBITMAP hBitmap = CreateBitmap(100, 100, 24, 0, NULL);
    ///     
    ///     // 将位图选入内存设备上下文(DC)
    ///     SelectObject(hdcMem, hBitmap);
    ///     
    ///     // 绘制源图像
    ///     BitBlt(hdcMem, 0, 0, 100, 100, hdc, 0, 0, SRCCOPY);
    ///     
    ///     // 获取目标设备上下文(DC)的宽度和高度
    ///     int nWidth = GetDeviceCaps(hdc, HORZRES);
    ///     int nHeight = GetDeviceCaps(hdc, VERTRES);
    ///     
    ///     // 设置目标设备上下文(DC)的 stretching 模式
    ///     SetStretchBltMode(hdc, STRETCH_ANDSCANS);
    ///     
    ///     // 将图像从内存设备上下文(DC)复制到目标设备上下文(DC)
    ///     StretchBlt(hdc, 0, 0, nWidth, nHeight, hdcMem, 0, 0, 100, 100, SRCCOPY);
    ///     
    ///     // 释放资源
    ///     DeleteObject(hBitmap);
    ///     DeleteDC(hdcMem);
    ///     ReleaseDC(NULL, hdc);
    /// ]]>
    /// </code>
    /// </example>
    public class Gdi32
    {
        /// <summary>
        /// 用于将一个设备上下文(DC)中的区域复制到另一个设备上下文(DC)中。这个函数可以用于复制图像且保持图像的原始尺寸。
        /// </summary>
        /// <remarks>
        /// <para>
        /// stretching 模式是在设备上下文(DC)中设置的，而不是在图像本身设置的。因此，在调用BitBlt函数之前，需要使用SetStretchBltMode函数设置适当的 stretching 模式。
        /// </para>
        /// </remarks>
        /// <example>
        /// 以下是一个示例，演示如何直接使用gdi32.dll中的SelectObject函数：
        /// <code lang="cpp">
        /// <![CDATA[
        ///     HDC hdc = GetDC(NULL);
        ///     HDC hdcMem = CreateCompatibleDC(hdc);
        ///     
        ///     ...
        ///     
        ///     // 创建一个位图，用于存储源图像
        ///     HBITMAP hBitmap = CreateBitmap(100, 100, 24, 0, NULL);
        ///     
        ///     // 将位图选入内存设备上下文(DC)
        ///     SelectObject(hdcMem, hBitmap);
        ///     
        ///     ...
        /// ]]>
        /// </code>
        /// </example>
        /// <param name="hdcDest">目标设备上下文(DC)的句柄</param>
        /// <param name="nXDest">目标设备上下文中复制区域的左上角x坐标</param>
        /// <param name="nYDest">目标设备上下文中复制区域的左上角y坐标</param>
        /// <param name="nWidth">要复制的区域宽度</param>
        /// <param name="nHeight">要复制的区域高度</param>
        /// <param name="hdcSrc">源设备上下文(DC)的句柄</param>
        /// <param name="nXSrc">源设备上下文中复制区域的左上角x坐标</param>
        /// <param name="nYSrc">源设备上下文中复制区域的左上角y坐标</param>
        /// <param name="dwRop">指定复制操作的rop代码。例如，SRCCOPY表示源设备上下文(DC)中的像素值将被复制到目标设备上下文(DC)中</param>
        /// <returns>
        /// 如果函数成功，返回非0值。
        /// 如果函数失败，返回0。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);

        /// <summary>
        /// 用于创建一个与指定设备兼容的位图。这个函数可以用于创建一个与指定设备上下文(DC)具有相同设备格式和颜色深度的新位图。
        /// </summary>
        /// <example>
        /// 以下是一个示例，演示如何直接使用gdi32.dll中的CreateCompatibleBitmap函数：
        /// <code lang="cpp">
        /// <![CDATA[
        ///     HDC hdc = GetDC(NULL);
        ///     
        ///     // 获取设备上下文（DC）的宽度和高度
        ///     int nWidth = GetDeviceCaps(hdc, HORZRES);
        ///     int nHeight = GetDeviceCaps(hdc, VERTRES);
        ///     
        ///     // 创建一个与设备上下文（DC）兼容的位图
        ///     HBITMAP hBitmap = CreateCompatibleBitmap(hdc, nWidth, nHeight);
        ///     
        ///     // 释放资源
        ///     ReleaseDC(NULL, hdc);
        /// ]]>
        /// </code>
        /// </example>
        /// <param name="hdc">设备上下文(DC)的句柄，用于指定新位图的设备格式和颜色深度</param>
        /// <param name="nWidth">新位图的宽度，以像素为单位</param>
        /// <param name="nHeight">新位图的高度，以像素为单位</param>
        /// <returns>
        /// 如果函数成功，返回新位图的句柄。
        /// 如果函数失败，返回0。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);

        /// <summary>
        /// 用于创建一个与指定设备兼容的设备上下文(DC)。这个函数可以用于在内存中创建一个与指定设备具有相同设备格式和颜色深度的设备上下文(DC)。
        /// </summary>
        /// <example>
        /// 以下是一个示例，演示如何直接使用gdi32.dll中的CreateCompatibleDC函数：
        /// <code lang="cpp">
        /// <![CDATA[
        ///     HDC hdc = GetDC(NULL);
        ///     
        ///     // 创建一个与设备上下文（DC）兼容的设备上下文（DC）
        ///     HDC hdcMem = CreateCompatibleDC(hdc);
        ///     
        ///     // 释放资源
        ///     ReleaseDC(NULL, hdc);
        /// ]]>
        /// </code>
        /// </example>
        /// <param name="hdc">设备上下文(DC)的句柄，用于指定新设备上下文(DC)的设备格式和颜色深度</param>
        /// <returns>
        /// 如果函数成功，返回新设备上下文(DC)的句柄。
        /// 如果函数失败，返回0。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

        /// <summary>
        /// 用于创建一个设备上下文(DC)。这个函数可以用于在内存中创建一个与指定设备具有相同设备格式和颜色深度的设备上下文(DC)。
        /// </summary>
        /// <param name="lpszDriverName">指定驱动程序名称的字符串</param>
        /// <param name="lpszDeviceName"> 指定设备名称的字符串</param>
        /// <param name="lpszPortName">指定端口名称的字符串。无用，可以设为"NULL"</param>
        /// <param name="lpDevMode">一个指向DEVMODE结构体的指针，用于指定设备上下文(DC)的设备格式和颜色深度</param>
        /// <returns>
        /// 如果函数成功，返回新设备上下文(DC)的句柄。
        /// 如果函数失败，返回0。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateDC(string lpszDriverName, string lpszDeviceName, string lpszPortName, IntPtr lpDevMode);

        /// <summary>
        /// 创建字体
        /// </summary>
        /// <param name="nHeight"> 字体的高度（以逻辑单位表示）。如果这个值是正数，它指定字符的高度；如果是负数，它指定字符的细胞或em方块的高度</param>
        /// <param name="nWidth">字体的平均字符宽度（以逻辑单位表示）。如果这个值为0，则系统会根据字体的高度自动计算宽度。</param>
        /// <param name="nEscapement"> 以十分之一度表示的文本的输出角度。例如，450表示45度。</param>
        /// <param name="nOrientation">以十分之一度表示的每个字符的基线相对于页面的方向。通常，对于左到右的文本，这个值和nEscapement相同。</param>
        /// <param name="fnWeight">字体的粗细，可以是普通（400）、加粗（700）等值。。可以取值来自WinGdi中的"Font Weights"</param>
        /// <param name="fdwItalic">是否斜体。如果这个值非零，则字体是斜体的。</param>
        /// <param name="fdwUnderline"> 是否有下划线。如果这个值非零，则字体有下划线。</param>
        /// <param name="fdwStrikeOut">是否有删除线。如果这个值非零，则字体有删除线。</param>
        /// <param name="fdwCharSet"> 字符集标识符，决定了字体支持哪种字符集。</param>
        /// <param name="fdwOutputPrecision">输出精度，定义了字体的质量。</param>
        /// <param name="fdwClipPrecision">裁剪精度，定义了如何裁剪字符。</param>
        /// <param name="fdwQuality"> 输出质量，定义了字体的清晰度和抗锯齿能力。</param>
        /// <param name="fdwPitchAndFamily"> 字体的间距和类别。</param>
        /// <param name="lpszFaceName">字体名称。</param>
        /// <returns>
        /// 如果函数成功执行，返回一个字体句柄。
        /// 如果函数失败，返回NULL。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateFont(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, uint fdwItalic, uint fdwUnderline, uint fdwStrikeOut, uint fdwCharSet, uint fdwOutputPrecision, uint fdwClipPrecision, uint fdwQuality, uint fdwPitchAndFamily, string lpszFaceName);

        /// <summary>
        /// 根据指定的参数创建一个画刷，并返回一个画刷句柄。
        /// </summary>
        /// <param name="fnStyle">
        /// 指定画刷的图案类型。这个参数可以是以下值之一：
        ///     HS_HORIZONTAL：水平线图案
        ///     HS_VERTICAL：垂直线图案
        ///     HS_FDIAGONAL：对角线图案
        ///     HS_BDIAGONAL：反对角线图案
        ///     HS_CROSS：十字线图案
        ///     HS_DIAGCROSS：对角线和十字线图案
        /// </param>
        /// <param name="color">指定画刷的颜色。这个参数是一个 COLORREF 类型的值，表示红、绿、蓝三个颜色通道的组合。</param>
        /// <returns>
        /// 如果函数成功执行，返回一个画刷句柄。
        /// 如果函数失败，返回NULL。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateHatchBrush(int fnStyle, uint color);

        /// <summary>
        /// 创建一支画笔
        /// </summary>
        /// <param name="nStyle">指定笔的风格，取值来自WinGdi中的"Pen Styles"</param>
        /// <param name="nWidth">指定笔的宽度，以逻辑单位为单位</param>
        /// <param name="crColor">指定笔的颜色，使用 RGB 值表示</param>
        /// <returns>
        /// 如果函数成功执行，返回一个画笔句柄。
        /// 如果函数失败，返回NULL。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreatePen(int nStyle, int nWidth, uint crColor);

        /// <summary>
        /// 创建一个纯色的画刷。
        /// </summary>
        /// <param name="color">指定画刷的颜色。这个参数是一个 COLORREF 类型的值，表示红、绿、蓝三个颜色通道的组合。</param>
        /// <returns>
        /// 如果函数成功执行，返回一个画刷句柄.
        /// 如果函数失败，返回NULL。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateSolidBrush(uint color);

        /// <summary>
        /// 用于删除一个设备上下文(DC)。这个函数可以用于释放设备上下文(DC)的句柄，并将其从内存中删除
        /// </summary>
        /// <example>
        /// 以下是一个示例，演示如何直接使用gdi32.dll中的DeleteDC函数：
        /// <code lang="cpp">
        /// <![CDATA[
        ///     HDC hdc = GetDC(NULL);
        ///     HDC hdcMem = CreateCompatibleDC(hdc);
        ///     
        ///     ...
        ///     DeleteDC(hdcMem);
        ///     ...
        /// ]]>
        /// </code>
        /// </example>
        /// <param name="hdc">要删除的设备上下文(DC)的句柄</param>
        /// <returns>
        /// 如果函数成功，返回非0值。
        /// 如果函数失败，返回0。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern IntPtr DeleteDC(IntPtr hdc);

        /// <summary>
        /// 用于删除一个图形对象。这个函数可以用于释放图形对象（如位图、画刷、字体等）的句柄，并将其从内存中删除。
        /// </summary>
        /// <example>
        /// 以下是一个示例，演示如何直接使用gdi32.dll中的DeleteObject函数：
        /// <code lang="cpp">
        /// <![CDATA[
        ///     ...
        ///     // 创建一个位图，用于存储源图像
        ///     HBITMAP hBitmap = CreateBitmap(100, 100, 24, 0, NULL);
        ///     ...
        ///     
        ///     // 释放资源
        ///     DeleteObject(hBitmap);
        ///     ...
        /// ]]>
        /// </code>
        /// </example>
        /// <param name="hdc">要删除的图形对象的句柄</param>
        /// <returns>
        /// 如果函数成功，返回非0值。
        /// 如果函数失败，返回0。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern IntPtr DeleteObject(IntPtr hObject);

        /// <summary>
        /// 在指定的设备上下文（DC）中绘制一个椭圆。
        /// </summary>
        /// <param name="hdc">设备上下文句柄。</param>
        /// <param name="nLeftRect">指定椭圆区域的左边界坐标，以逻辑像素为单位。</param>
        /// <param name="nTopRect">指定椭圆区域的顶部边界坐标，以逻辑像素为单位。</param>
        /// <param name="nRightRect">指定椭圆区域的右边界坐标，以逻辑像素为单位。</param>
        /// <param name="nBottomRect">指定椭圆区域的底部边界坐标，以逻辑像素为单位。</param>
        /// <returns>
        /// 如果函数成功执行，返回值为非零值。
        /// 如果函数失败，返回值为零。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern bool Ellipse(IntPtr hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);

        /// <summary>
        /// 用于在指定的设备上下文（DC）中绘制文本。
        /// </summary>
        /// <param name="hdc">设备上下文句柄。</param>
        /// <param name="nXStart">指定文本起始位置的 x 坐标，以逻辑像素为单位。</param>
        /// <param name="nYStart">指定文本起始位置的 y 坐标，以逻辑像素为单位。</param>
        /// <param name="options"></param>
        /// <param name="lprect">指向一个RECT结构体的指针，该结构体定义了文本绘制的范围。</param>
        /// <param name="text">要绘制的文本。</param>
        /// <returns>
        /// 如果函数成功执行，返回值为非零值。
        /// 如果函数失败，返回值为零。
        /// </returns>
        [DllImport("gdi32.dll", SetLastError = true)]
        public static extern bool ExtTextOut(IntPtr hdc, int nXStart, int nYStart, uint options, IntPtr lprect, string text);

        /// <summary>
        /// 在指定的设备上下文（DC）中绘制一条从当前绘制位置到指定位置的直线。
        /// </summary>
        /// <param name="hdc">设备上下文句柄。</param>
        /// <param name="nXEnd">指定直线终点的 x 坐标，以逻辑像素为单位。</param>
        /// <param name="nYEnd">指定直线终点的 y 坐标，以逻辑像素为单位。</param>
        /// <returns>
        /// 如果函数成功执行，返回值为非零值。
        /// 如果函数失败，返回值为零。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern bool LineTo(IntPtr hdc, int nXEnd, int nYEnd);

        /// <summary>
        /// 将当前绘制位置移动到指定的位置。
        /// </summary>
        /// <param name="hdc">设备上下文句柄。</param>
        /// <param name="nX">指定新绘制位置的 x 坐标，以逻辑像素为单位。</param>
        /// <param name="nY">指定新绘制位置的 y 坐标，以逻辑像素为单位。</param>
        /// <param name="lpPoint">指向一个POINT结构体的指针，该结构体将保存旧绘制位置的坐标。如果该参数为 NULL，那么旧绘制位置的坐标将被忽略。</param>
        /// <returns>
        /// 如果函数成功执行，返回值为非零值。
        /// 如果函数失败，返回值为零。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern bool MoveToEx(IntPtr hdc, int nX, int nY, IntPtr lpPoint);

        /// <summary>
        /// 在指定的设备上下文（DC）中绘制一条平滑曲线。
        /// </summary>
        /// <param name="hdc">设备上下文句柄。</param>
        /// <param name="lpPoints">指向一个POINT结构体数组的指针，该数组包含曲线的控制点。每个控制点都是一个包含 x 和 y 坐标的POINT结构体。</param>
        /// <param name="nCount">指定控制点的数量。</param>
        /// <returns>
        /// 如果函数成功执行，返回值为非零值。
        /// 如果函数失败，返回值为零。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern bool PolyBezier(IntPtr hdc, [In] POINT[] lpPoints, int nCount);

        /// <summary>
        /// 在指定的设备上下文（DC）中绘制一个矩形。
        /// </summary>
        /// <param name="hdc">设备上下文句柄。</param>
        /// <param name="nLeftRect">指定矩形区域的左边界坐标，以逻辑像素为单位。</param>
        /// <param name="nTopRect">指定矩形区域的顶部边界坐标，以逻辑像素为单位。</param>
        /// <param name="nRightRect">指定矩形区域的右边界坐标，以逻辑像素为单位。</param>
        /// <param name="nBottomRect">指定矩形区域的底部边界坐标，以逻辑像素为单位。</param>
        /// <returns>
        /// 如果函数成功执行，返回值为非零值。
        /// 如果函数失败，返回值为零。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern bool Rectangle(IntPtr hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
        /// <summary>
        /// 选择一个系统预定义的画刷、字体或像素格式。
        /// </summary>
        /// <param name="nStockObject">画刷、字体或像素格式的句柄代码</param>
        /// <returns>画刷、字体或像素格式的句柄</returns>
        [DllImport("gdi32.dll", SetLastError = true)]
        public static extern IntPtr SelectStockObject(int nStockObject);
        /// <summary>
        /// 用于选择一个图形对象（如位图、画刷、字体等）并将其设置为当前设备上下文(DC)的默认对象。
        /// </summary>
        /// <example>
        /// 以下是一个示例，演示如何直接使用gdi32.dll中的SelectObject函数：
        /// <code lang="cpp">
        /// <![CDATA[
        ///     HDC hdc = GetDC(NULL);
        ///     HDC hdcMem = CreateCompatibleDC(hdc);
        ///     
        ///     ...
        ///     
        ///     // 创建一个位图，用于存储源图像
        ///     HBITMAP hBitmap = CreateBitmap(100, 100, 24, 0, NULL);
        ///     
        ///     // 将位图选入内存设备上下文(DC)
        ///     SelectObject(hdcMem, hBitmap);
        ///     
        ///     ...
        /// ]]>
        /// </code>
        /// </example>
        /// <param name="hdc">设备上下文(DC)的句柄</param>
        /// <param name="hObject">要选择的图形对象的句柄</param>
        /// <returns>
        /// 如果函数成功，返回被替换的图形对象的句柄。
        /// 如果函数失败，返回0。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObject);

        /// <summary>
        /// 将指定的颜色设置为当前设备上下文中的背景颜色。
        /// </summary>
        /// <param name="hdc">设备上下文句柄。</param>
        /// <param name="crColor">指定背景颜色的颜色值。这个参数是一个 COLORREF 类型的值，表示红、绿、蓝三个颜色通道的组合。</param>
        /// <returns>
        /// 如果函数成功执行，返回当前背景颜色的旧颜色值。
        /// 如果函数失败，返回值为 -1。
        /// </returns>
        [DllImport("gdi32.dll", SetLastError = true)]
        public static extern int SetBkColor(IntPtr hdc, uint crColor);

        /// <summary>
        /// 设置背景透明
        /// </summary>
        /// <param name="hdc">设备上下文句柄。</param>
        /// <param name="nBkMode">
        /// 0不透明；1透明
        ///     TRANSPARENT：背景颜色将透明，即绘制文本时，背景区域将显示 underlying 颜色。
        ///     OPAQUE：背景颜色将不透明，即绘制文本时，背景区域将被覆盖，类似于TextOut函数。
        ///     BKMODE_LAST：最后一个背景模式。
        /// </param>
        /// <returns>
        /// 如果函数成功执行，返回当前背景模式的颜色值。
        /// 如果函数失败，返回值为 -1。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern int SetBkMode(IntPtr hdc, int nBkMode);

        /// <summary>
        /// 将指定的颜色设置为当前设备上下文中的画笔颜色。
        /// </summary>
        /// <param name="hdc">设备上下文句柄。</param>
        /// <param name="crColor">指定画笔颜色的颜色值。这个参数是一个 COLORREF 类型的值，表示红、绿、蓝三个颜色通道的组合。</param>
        /// <returns>
        /// 如果函数成功执行，返回当前画笔颜色的旧颜色值。
        /// 如果函数失败，返回值为 -1。
        /// </returns>
        [DllImport("gdi32.dll")]
        internal static extern bool SetDCPenColor(IntPtr hdc, uint crColor);
        /// <summary>
        /// 用于设置设备上下文(DC)的 stretching 模式。这个函数用于控制如何将一个图像从一个源设备上下文(DC)复制到另一个目标设备上下文(DC)，同时可以调整图像的大小。
        /// </summary>
        /// <remarks>
        /// <para>
        /// stretching 模式是在设备上下文(DC)中设置的，而不是在图像本身设置的。因此，在调用SetStretchBltMode函数之后，需要使用BitBlt或StretchBlt函数将图像复制到目标设备上下文(DC)中。
        /// </para>
        /// </remarks>
        /// <example>
        /// 以下是一个示例，演示如何直接使用gdi32.dll中的SetStretchBltMode函数设置 stretching 模式：
        /// <code lang="cpp">
        /// <![CDATA[
        ///     HDC hdc = GetDC(NULL);
        ///     HDC hdcMem = CreateCompatibleDC(hdc);
        ///     
        ///     // 设置 stretching 模式
        ///     SetStretchBltMode(hdcMem, STRETCH_ANDSCANS);
        ///     
        ///     ....
        ///     
        ///     // 设置目标设备上下文(DC)的 stretching 模式
        ///     SetStretchBltMode(hdc, STRETCH_ANDSCANS);
        ///     
        ///     ....
        /// ]]>
        /// </code>
        /// </example>
        /// <param name="hdc">目标设备上下文(DC)的句柄</param>
        /// <param name="iStretchMode">指定 stretching 模式。这个参数可以是一个常量，如STRETCH_ANDSCANS、STRETCH_ORSCANS、STRETCH_DELETESCANS、STRETCH_MIRROR、STRETCH_SHRINKONLY等</param>
        /// <returns>
        /// 如果函数成功，返回之前的 stretching 模式。
        /// 如果函数失败，返回0。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern int SetStretchBltMode(IntPtr hdc, int iStretchMode);

        /// <summary>
        /// 将指定的颜色设置为当前设备上下文中的文本颜色。
        /// </summary>
        /// <param name="hdc">设备上下文句柄。</param>
        /// <param name="crColor">指定文本颜色的颜色值。这个参数是一个 COLORREF 类型的值，表示红、绿、蓝三个颜色通道的组合。</param>
        /// <returns>
        /// 如果函数成功执行，返回当前文本颜色的旧颜色值。
        /// 如果函数失败，返回值为 -1。
        /// </returns>
        [DllImport("gdi32.dll")]
        internal static extern uint SetTextColor(IntPtr hdc, uint crColor);

        ///<summary>
        /// 用于将一个设备上下文(DC)中的区域复制到另一个设备上下文(DC)中，同时可以调整图像的大小。这个函数可以用于平铺图像或调整图像大小。
        ///</summary>
        ///<example>
        /// 以下是一个示例，演示如何直接使用gdi32.dll中的StretchBlt函数：
        /// <code lang="cpp">
        /// <![CDATA[
        ///     HDC hdc = GetDC(NULL);
        ///     HDC hdcMem = CreateCompatibleDC(hdc);
        ///     
        ///     ...
        ///     
        ///     // 获取目标设备上下文(DC)的宽度和高度
        ///     int nWidth = GetDeviceCaps(hdc, HORZRES);
        ///     int nHeight = GetDeviceCaps(hdc, VERTRES);
        ///     
        ///     ...
        ///     
        ///     // 将图像从内存设备上下文(DC)复制到目标设备上下文(DC)
        ///     StretchBlt(hdc, 0, 0, nWidth, nHeight, hdcMem, 0, 0, 100, 100, SRCCOPY);
        ///     
        ///     ...
        /// ]]>
        /// </code>
        /// </example>
        ///<param name="hdcDest">目标设备上下文(DC)的句柄</param>
        ///<param name="nXDest">目标设备上下文中复制区域的左上角x坐标</param>
        ///<param name="nYDest">目标设备上下文中复制区域的左上角y坐标</param>
        ///<param name="nWidthDest">要复制的区域宽度</param>
        ///<param name="nHeightDest">要复制的区域高度</param>
        ///<param name="hdcSrc">源设备上下文(DC)的句柄</param>
        ///<param name="nXSrc">源设备上下文中复制区域的左上角x坐标</param>
        ///<param name="nYSrc">源设备上下文中复制区域的左上角y坐标</param>
        ///<param name="nWidthSrc">源设备上下文中要复制的区域宽度</param>
        ///<param name="nHeightSrc">源设备上下文中要复制的区域高度</param>
        ///<param name="dwRop">指定复制操作的rop代码。例如，SRCCOPY表示源设备上下文(DC)中的像素值将被复制到目标设备上下文(DC)中</param>
        ///<returns>
        /// 如果函数成功，返回非0值。
        /// 如果函数失败，返回0。
        ///</returns>
        [DllImport("gdi32.dll")]
        public static extern bool StretchBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidthDest, int nHeightDest, IntPtr hdcSrc, int nXSrc, int nYSrc, int nWidthSrc, int nHeightSrc, int dwRop);

        /// <summary>
        /// 在给定的位置绘制指定的文本，并可以设置文本的格式和样式。
        /// </summary>
        /// <param name="hdc">设备上下文的句柄</param>
        /// <param name="nXStart">指定文本起始位置的 x 坐标，以逻辑像素为单位。</param>
        /// <param name="nYStart">指定文本起始位置的 y 坐标，以逻辑像素为单位。</param>
        /// <param name="lpString">要输出的字符串</param>
        /// <param name="nCount">指定要绘制的文本字符数。</param>
        /// <returns>
        /// 如果函数成功，返回非零值。
        /// 如果函数失败，返回零。
        /// </returns>
        [DllImport("gdi32.dll")]
        public static extern bool TextOut(IntPtr hdc, int nXStart, int nYStart, string lpString, int nCount);
    }
}